/**
 * ==========================================
 *
 * 中间件
 *
 *      应用级中间件
 *      路由级中间件
 *      错误处理中间件
 *      第三方中间件
 *
 *
 * koa 和  express中间件的区别：
 *      express 是从上向下顺序匹配
 *      koa 是 无论中间件写在哪里 先执行中间件  再执行路由
 *          中间件（或路由）之间是从上向下顺序执行
 *          如果中间件里有 next  则 先执行中间件，再匹配路由，
 *          再中间件倒序执行 next 后面的东西
 *          类似洋葱的纹理顺序
 *
 * 例：
 *      app.use(async (ctx, next) = > {
 *
 *          console.log(1);
 *          next();
 *          console.log(5);
 *      });
 *
 *      app.use(async (ctx, next) => {
 *
 *          console.log(2);
 *          next();
 *          console.log(4);
 *      })
 *
 *      app.get('/', async (ctx) => {
 *
 *          console.log(3);
 *          ctx.body = '首页';
 *      });
 *
 * ==========================================
 */

const Koa = require('koa');
const router = require('koa-router')();
const app = new Koa();

const static = require('koa-static');
const staticPath = './static';

const bodyParser = require('koa-bodyparser');


// 三方中间件
// 设置静态托管服务
app.use(static(
    path.join(__dirname, staticPath)
))
// app.use(static(__dirname + './static'));
// app.use(static(staticPath));


// 三方中间件
// 处理post参数
app.use(bodyParser());


// Koa 中间件
app.use(async (ctx, next) => {
    console.log(new Date());
    await next();
});

router.get('/', async (ctx) => {
   ctx.body = '首页';
});



router.get('/news', async (ctx, next) => {
    console.log('经过路由级中间件');
    await next();
});
router.get('/news', async (ctx) => {
    ctx.body = '新闻页';
});


/**
 * ==========================================
 *
 * 错误处理中间件
 *
 * ==========================================
 */
router.use(async (ctx, next) => {

    next(); // 先匹配路由， 如果路由找不到 下面做判断.

   if(ctx.status == 404) {
       ctx.status = 404;
       ctx.body = '404页面';
   }
});


app.use(router.routes());


app.listen(8088);